🌎 rns.kin.earth git 🌍
Commit f2a778ffa4bd0441f22db4a2e10b8562c330a14f
Parents : 1a77b57
Author : Mark Qvist <mark@unsigned.io>
Date : 2026-01-03T02:20:24+01:00
Implemented discovery announce encryption
Changes
2 files changed, 23 insertions(+), 9 deletions(-)
Diff
diff --git a/RNS/Discovery.py b/RNS/Discovery.py
index e111cdb7..c458a49b 100644
--- a/RNS/Discovery.py
+++ b/RNS/Discovery.py
@@ -93,7 +93,7 @@ class InterfaceAnnouncer():
if not interface_type in self.DISCOVERABLE_INTERFACE_TYPES: return None
else:
- flags = bytes([0x00])
+ flags = 0x00
info = {INTERFACE_TYPE: interface_type,
TRANSPORT: RNS.Reticulum.transport_enabled(),
TRANSPORT_ID: RNS.Transport.identity.hash,
@@ -134,13 +134,22 @@ class InterfaceAnnouncer():
packed = msgpack.packb(info)
infohash = RNS.Identity.full_hash(packed)
- if infohash in self.stamp_cache: return flags+packed+self.stamp_cache[infohash]
+ if infohash in self.stamp_cache: stamp = self.stamp_cache[infohash]
else: stamp, v = self.stamper.generate_stamp(infohash, stamp_cost=stamp_value, expand_rounds=self.WORKBLOCK_EXPAND_ROUNDS)
-
if not stamp: return None
- else:
- self.stamp_cache[infohash] = stamp
- return flags+packed+stamp
+ else: self.stamp_cache[infohash] = stamp
+
+ if interface.discovery_encrypt:
+ flags |= InterfaceAnnounceHandler.FLAG_ENCRYPTED
+ if not self.owner.has_network_identity():
+ RNS.log(f"Discovery encryption requested for {interface}, but no network identity configured. Aborting discovery announce.", RNS.LOG_ERROR)
+ return None
+
+ else: payload = self.owner.network_identity.encrypt(packed+stamp)
+
+ else: payload = packed+stamp
+
+ return bytes([flags])+payload
class InterfaceAnnounceHandler:
FLAG_SIGNED = 0b00000001
@@ -172,6 +181,11 @@ class InterfaceAnnounceHandler:
signed = flags & self.FLAG_SIGNED
encrypted = flags & self.FLAG_ENCRYPTED
+ if encrypted:
+ if not RNS.Transport.has_network_identity(): return
+ app_data = RNS.Transport.network_identity.decrypt(app_data)
+ if not app_data: return
+
stamp = app_data[-self.stamper.STAMP_SIZE:]
packed = app_data[:-self.stamper.STAMP_SIZE]
infohash = RNS.Identity.full_hash(packed)
diff --git a/RNS/Reticulum.py b/RNS/Reticulum.py
index 9e76fa8b..7e992297 100755
--- a/RNS/Reticulum.py
+++ b/RNS/Reticulum.py
@@ -708,7 +708,7 @@ class Reticulum:
discovery_announce_interval = None
discovery_stamp_value = None
discovery_name = None
- discovery_sign = False
+ discovery_encrypt = False
reachable_on = None
publish_ifac = False
latitude = None
@@ -728,7 +728,7 @@ class Reticulum:
if discovery_announce_interval == None: discovery_announce_interval = 6*60*60
if "discovery_stamp_value" in c: discovery_stamp_value = c.as_int("discovery_stamp_value")
if "discovery_name" in c: discovery_name = c["discovery_name"]
- if "discovery_sign" in c: discovery_sign = c.as_bool("discovery_sign")
+ if "discovery_encrypt" in c: discovery_encrypt = c.as_bool("discovery_encrypt")
if "reachable_on" in c: reachable_on = c["reachable_on"]
if "publish_ifac" in c: publish_ifac = c.as_bool("publish_ifac")
if "latitude" in c: latitude = c.as_float("latitude")
@@ -759,7 +759,7 @@ class Reticulum:
interface.discovery_publish_ifac = publish_ifac
interface.reachable_on = reachable_on
interface.discovery_name = discovery_name
- interface.discovery_sign = discovery_sign
+ interface.discovery_encrypt = discovery_encrypt
interface.discovery_stamp_value = discovery_stamp_value
interface.discovery_latitude = latitude
interface.discovery_longitude = longitude
Served by rngit 1.5.2 - Generated in 0.08s